home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.hitl.washington.edu
/
ftp.hitl.washington.edu.tar
/
ftp.hitl.washington.edu
/
pub
/
people
/
tsoper
/
CT Explorer
/
ScrollSlider.cs
< prev
next >
Wrap
Text File
|
2005-05-31
|
12KB
|
420 lines
//ScrollSlider.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace MyCustomControls
{
public class ScrollSlider : System.Windows.Forms.UserControl
{
//Controls
private System.Windows.Forms.Panel panel_Container;
private System.Windows.Forms.Panel panel_Left;
private System.Windows.Forms.Splitter splitter_Left;
private System.Windows.Forms.Splitter splitter_Right;
private System.Windows.Forms.Panel panel_Center;
private System.Windows.Forms.Panel panel_Right;
//Properties
private float window;
public float Window
{
get
{
return window;
}
set
{
window = value;
UpdateControlAfterStretch();
}
}
private float level;
public float Level
{
get
{
return level;
}
set
{
level = value;
UpdateControlAfterScroll();
}
}
//Events
public event EventHandler Scroll;
public event EventHandler Stretch;
public event MouseEventHandler MouseDown;
public event MouseEventHandler MouseUp;
//Mouse Input
bool mouseDown_cp = false; //mouse down on center panel
bool mouseDown_sr = false; //mouse down on right splitter
bool mouseDown_sl = false; //mouse down on left splitter
Point mousePos;
//Control Colors
public Color SliderColor;
public Color SliderActiveColor;
public Color BackColor;
public Color SliderEndColor;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public ScrollSlider()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// TODO: Add any initialization after the InitializeComponent call
//initialize window and level
//this.Window = 0.3f;
//this.Level = 0.5f;
//set docking attributes of panels and splitters
this.panel_Container.Dock = DockStyle.Fill;
this.splitter_Right.Dock = DockStyle.Right;
this.panel_Right.Dock = DockStyle.Right;
this.panel_Left.Dock = DockStyle.Left;
this.splitter_Left.Dock = DockStyle.Left;
//need to see left side splitter
splitter_Left.BringToFront();
//get rid of the margins
//i.e. let splitters touch container sides
//and keep the the splitters zero distance away
this.splitter_Left.MinSize = 0;
this.splitter_Right.MinSize = 0;
this.splitter_Left.MinExtra = 0;
this.splitter_Right.MinExtra = 0;
//set up the callbacks for user based events
splitter_Left.MouseMove += new MouseEventHandler(
splitter_MouseMove);
splitter_Left.MouseDown += new MouseEventHandler(
splitter_MouseDown);
splitter_Left.MouseUp += new MouseEventHandler(
splitter_MouseUp);
splitter_Right.MouseMove += new MouseEventHandler(
splitter_MouseMove);
splitter_Right.MouseDown += new MouseEventHandler(
splitter_MouseDown);
splitter_Right.MouseUp += new MouseEventHandler(
splitter_MouseUp);
panel_Center.MouseDown += new MouseEventHandler(
panel_Center_MouseDown);
panel_Center.MouseUp += new MouseEventHandler(
panel_Center_MouseUp);
panel_Center.MouseMove += new MouseEventHandler(
panel_Center_MouseMove);
this.Resize += new EventHandler(panel_Container_Resize);
//set the control colors
this.SliderColor = Color.Transparent;
this.SliderActiveColor = Color.White;
this.BackColor = Color.Gray;
this.SliderEndColor = Color.Transparent;
this.panel_Center.BackColor = SliderColor;
this.panel_Left.BackColor = BackColor;
this.panel_Right.BackColor = BackColor;
splitter_Right.BorderStyle = BorderStyle.Fixed3D;
splitter_Right.BorderStyle = BorderStyle.Fixed3D;
panel_Container.BorderStyle = BorderStyle.Fixed3D;
}
private void UpdateControlAfterScroll()
{
int cx = this.Width;
int cy = this.Height;
int windowInPixels = (int)(window*cx);
int levelInPixels = (int)(level*cx);
int leftMarginInPixels = levelInPixels - windowInPixels/2;
int rightMarginInPixels = cx - windowInPixels - leftMarginInPixels;
//change location of panel_Center
panel_Center.Location = new Point(leftMarginInPixels, 0);
//change size of panel_Left
panel_Left.Size = new Size(leftMarginInPixels,
panel_Left.Height);
//change bounds of panel_Right (add - 4=splitter.Width?)
panel_Right.SetBounds(cx-rightMarginInPixels-4,0,
rightMarginInPixels,panel_Right.Height);
}
private void UpdateControlAfterStretch()
{
int cx = this.Width;
int cy = this.Height;
int windowInPixels = (int)(window*cx);
int levelInPixels = (int)(level*cx);
int leftMarginInPixels = levelInPixels - windowInPixels/2;
int rightMarginInPixels = cx - windowInPixels - leftMarginInPixels;
//change size of panel_Left
panel_Left.Size = new Size(leftMarginInPixels,
panel_Left.Height);
//change location and size of panel_Center
panel_Center.SetBounds(leftMarginInPixels,0,
windowInPixels,panel_Center.Height);
//change bounds of panel_Right
panel_Right.SetBounds(cx-rightMarginInPixels-4,0,
rightMarginInPixels, panel_Right.Height);
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.panel_Container = new System.Windows.Forms.Panel();
this.splitter_Right = new System.Windows.Forms.Splitter();
this.panel_Right = new System.Windows.Forms.Panel();
this.panel_Center = new System.Windows.Forms.Panel();
this.splitter_Left = new System.Windows.Forms.Splitter();
this.panel_Left = new System.Windows.Forms.Panel();
this.panel_Container.SuspendLayout();
this.SuspendLayout();
//
// panel_Container
//
this.panel_Container.Controls.Add(this.splitter_Right);
this.panel_Container.Controls.Add(this.panel_Right);
this.panel_Container.Controls.Add(this.panel_Center);
this.panel_Container.Controls.Add(this.splitter_Left);
this.panel_Container.Controls.Add(this.panel_Left);
this.panel_Container.Location = new System.Drawing.Point(0, 0);
this.panel_Container.Name = "panel_Container";
this.panel_Container.Size = new System.Drawing.Size(150, 15);
this.panel_Container.TabIndex = 0;
this.panel_Container.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
//
// splitter_Right
//
this.splitter_Right.Location = new System.Drawing.Point(3, 0);
this.splitter_Right.Name = "splitter_Right";
this.splitter_Right.Size = new System.Drawing.Size(3, 96);
this.splitter_Right.TabIndex = 2;
this.splitter_Right.TabStop = false;
//
// panel_Right
//
this.panel_Right.Location = new System.Drawing.Point(168, 0);
this.panel_Right.Name = "panel_Right";
this.panel_Right.Size = new System.Drawing.Size(48, 96);
this.panel_Right.TabIndex = 4;
//
// panel_Center
//
this.panel_Center.Location = new System.Drawing.Point(96, 0);
this.panel_Center.Name = "panel_Center";
this.panel_Center.Size = new System.Drawing.Size(48, 96);
this.panel_Center.TabIndex = 3;
//
// splitter_Left
//
this.splitter_Left.Location = new System.Drawing.Point(0, 0);
this.splitter_Left.Name = "splitter_Left";
this.splitter_Left.Size = new System.Drawing.Size(3, 96);
this.splitter_Left.TabIndex = 1;
this.splitter_Left.TabStop = false;
//
// panel_Left
//
this.panel_Left.Location = new System.Drawing.Point(24, 0);
this.panel_Left.Name = "panel_Left";
this.panel_Left.Size = new System.Drawing.Size(48, 96);
this.panel_Left.TabIndex = 0;
//
// ScrollSlider
//
this.Controls.Add(this.panel_Container);
this.Name = "ScrollSlider";
this.Size = new System.Drawing.Size(160, 24);
this.Load += new System.EventHandler(this.ScrollSlider_Load);
this.panel_Container.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
}
private void splitter1_SplitterMoved(object sender, System.Windows.Forms.SplitterEventArgs e)
{
}
private void ScrollSlider_Load(object sender, System.EventArgs e)
{
}
//-------CALLBACKS--------------------------------------------
private void splitter_MouseDown(object sender, MouseEventArgs e)
{
if(sender.Equals(splitter_Left))
mouseDown_sl = true; //left splitter
else
mouseDown_sr = true; //right splitter
mousePos.X = e.X;
mousePos.Y = e.Y;
if(MouseDown!=null)
MouseDown(this,e);
}
private void splitter_MouseUp(object sender, MouseEventArgs e)
{
if(sender.Equals(splitter_Left))
mouseDown_sl = false; //left splitter
else
mouseDown_sr = false; //right splitter
if(MouseUp!=null)
MouseUp(this,e);
}
private void splitter_MouseMove(object sender, MouseEventArgs e)
{
if(mouseDown_sl || mouseDown_sr)
{
//get the change in position
int dxLeft, dxRight;
if(mouseDown_sl)
{
dxLeft = e.X - mousePos.X;
dxRight = - dxLeft;
}
else
{
dxRight = e.X - mousePos.X;
dxLeft = - dxRight;
}
//determine the margins
int marginLeft = panel_Left.Size.Width;
int marginRight = panel_Right.Size.Width;
int marginBetween = splitter_Right.Left -
splitter_Left.Right;
//prevent out-of-range values
if((dxLeft < 0) && ((-dxLeft) > marginLeft))
dxLeft = -marginLeft; //keep slider above lower limit
if((dxRight > 0) && ((dxRight) > marginRight))
dxRight = marginRight; //keep slider below upper limit
if((dxLeft > 0) && ((dxLeft*2) > (marginBetween - 5)))
dxLeft = (marginBetween-5)/2; //keep sliders on
dxRight = -dxLeft; //proper sides
//update controls
window += (dxRight - dxLeft)/(float)this.Width;
UpdateControlAfterStretch();
//fire stretch event
if(Stretch != null)
Stretch(this, e);
}
}
private void panel_Center_MouseDown(object sender, MouseEventArgs e)
{
panel_Center.BackColor = SliderActiveColor;
mouseDown_cp = true;
mousePos.X = e.X;
mousePos.Y = e.Y;
if(MouseDown!=null)
MouseDown(this,e);
}
private void panel_Center_MouseUp(object sender, MouseEventArgs e)
{
mouseDown_cp = false;
panel_Center.BackColor = Color.Transparent;
panel_Center.BackColor = SliderColor;
if(MouseUp!=null)
MouseUp(this,e);
}
private void panel_Center_MouseMove(object sender, MouseEventArgs e)
{
//slider is active... move it with the mouse
if(mouseDown_cp)
{
//determine how big the move is, and compare to margins
int dx = e.X - mousePos.X;
int marginLeft = panel_Left.Size.Width;
int marginRight = panel_Right.Size.Width;
if((dx < 0) && ((-dx) > marginLeft))
dx = -marginLeft; //keep slider above lower limit
if((dx > 0) && ((dx) > marginRight))
dx = marginRight; //keep slider below upper limit
//update controls after scroll
level += dx/(float)this.Width;
UpdateControlAfterScroll();
//fire scroll event
if(Scroll != null)
Scroll(this, e);
}
}
private void panel_Container_Resize(object sender, EventArgs e)
{
this.panel_Center.Left = splitter_Left.Left;
this.panel_Center.Size = new Size(splitter_Right.Left -
splitter_Left.Right,this.Height);
UpdateControlAfterScroll();
UpdateControlAfterStretch();
}
}
}